; ----------------------------------------------------------------------------------------
; 使用 C 语言库在控制台输出 "Hello World!"。程序运行在 Linux 或者其他在 C 语言库中不使用下划线的操作系统上。
; 如何编译执行:
;
;     nasm -felf64 hello.asm && gcc hello.o && ./a.out
; ----------------------------------------------------------------------------------------
%ifdef      MACOS
%define ENTRYPOINT    _main
%define SYSCALL_WRITE 0x2000004
%define SYSCALL_EXIT  0x2000001
%else
%define ENTRYPOINT    _start    ;_start
%define SYSCALL_WRITE 1
%define SYSCALL_EXIT  60
%endif


; %include "../Along32/Along32.inc"
global  ENTRYPOINT
; extern  puts
section .text


; 被 C 语言库的初始化代码所调用
ENTRYPOINT:
            mov rax, SYSCALL_WRITE ; write
            mov rdi, 1             ; stdout
            mov rsi, msg
            mov rdx, msg.len
            syscall
            mov rax, SYSCALL_EXIT  ; exit
            mov rdi, 0             ; return 0
            syscall
            ; mov  rdi, msg ; 在 rdi 中的第一个整数（或者指针）
            ; call puts     ; 输入文本
            ; ret           ; 由 main 函数返回 C 语言库例程

section .data
    msg  db  "Hello World!", 0x0A ; 注意到在 C 语言中字符串必须以 0 结束
    .len equ $-msg
